package it.giuseppetrisciuoglio.lyrics.processor.canzone;

import java.util.List;

import it.giuseppetrisciuoglio.lyrics.persistence.entity.Artista;
import it.giuseppetrisciuoglio.lyrics.persistence.entity.Canzone;
import it.giuseppetrisciuoglio.lyrics.persistence.entity.MetaDataInfoCanzone;
import it.giuseppetrisciuoglio.lyrics.persistence.repository.ArtistaRepository;
import it.giuseppetrisciuoglio.lyrics.persistence.repository.CanzoneRepository;
import it.giuseppetrisciuoglio.lyrics.persistence.repository.MetaDataInfoCanzoneRepository;
import it.giuseppetrisciuoglio.lyrics.service.youtube.YoutubeService;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class SongMetaDataInfoProcessor {

	@Autowired
	private CanzoneRepository canzoneRepository;
	@Autowired
	private ArtistaRepository artistaRepository;
	@Autowired
	private MetaDataInfoCanzoneRepository metaDataInfoCanzoneRepository;
	@Autowired
	private YoutubeService youtubeService;
	
	private final transient Logger log = LoggerFactory.getLogger(getClass());
	
	public void process(Long artistaId){
		log.debug("process(): artistaId={}", artistaId);
		Artista artista = artistaRepository.findOne(artistaId);
		List<Canzone> canzoni = canzoneRepository.findByArtistaAndTestoIsNotNull(artista);
		for (Canzone canzone : canzoni) {
			Long count = metaDataInfoCanzoneRepository.countByTipoAndCanzone(MetaDataInfoCanzone.TIPO_CANZONE_YOTUBE_URL, canzone);
			log.debug("process(): count={}", count);
			if (count == 0L){
				String url = youtubeService.getYoutubeVideoURL(artista.getNome(), canzone.getTitolo());
				log.debug("process(): artista={} titolo={}", artista.getNome(), canzone.getTitolo());
				log.debug("process(): youtube url={}", url);
				if (url != null && !url.isEmpty()){
					saveMetaDataInfoCanzone(canzone, MetaDataInfoCanzone.TIPO_CANZONE_YOTUBE_URL, url);
				}
			}
		}
	}
	
	private void saveMetaDataInfoCanzone(Canzone canzone, String tipo, String value){
		MetaDataInfoCanzone metaDataInfoCanzone = metaDataInfoCanzoneRepository.findByTipoAndCanzone(tipo, canzone);
		if (metaDataInfoCanzone == null){
			metaDataInfoCanzone = new MetaDataInfoCanzone();
		}
		metaDataInfoCanzone.setCanzone(canzone);
		metaDataInfoCanzone.setTipo(tipo);
		metaDataInfoCanzone.setValore(value);
		metaDataInfoCanzoneRepository.save(metaDataInfoCanzone);
	}
}
